# coding: utf-8
'''
@autor1: João Batista nº5479
@autor2: Luis Cabaço nº5606
@data Inicio: 18/11/2012 - 16:06
@data Fim: 3/12/2012 - 11:42
@obs:

Modulo para a criação dos graficos
	- Graficos em "tarte"
	- Graficos de "barras"

http://matplotlib.org/examples/pylab_examples/pie_demo.html

'''

import pylab as artista
import random
import numpy as np

class Criar_grafico():
	'''
		Class para a criação dos graficos
	'''
	
	def grafico_tarte(self, cabecalho, dados):
		'''
			Metodo para a criação de graficos de "tarte"

			Args:	
					cabecalho: cabeçalho dos dados
					
					dados: dados a serem mostrados no gráfico
		'''

		# faz a janela e os gomos
		artista.figure()
		ax = artista.axes([0.1, 0.1, 0.8, 0.8])

		labels = [] # legendas dos segmentos
		fracs = [] # valores dos segmentos
		explode = [] # separacao entre segmentos
		cores = [] # array das cores

		# verificacao se o valor nao é 0. adiciona ao grafico: 
		# titulo, dados, espaçamento e cores aleatorias

		for a in xrange(2, 18):
			if dados[a-2] > 0:
				labels.append(cabecalho[a])
				pass
			pass

		for b in xrange(0, 16):
			if dados[b] > 0:
				fracs.append(dados[b])
				cores.append([random.random(), random.random(), random.random()])
				explode.append(0.1)
				pass
			pass

		# transformar os valores do "autopct"
		# passa de "%" para numero total
		def my_autopct(pct):
			total=sum(fracs)
			val=int((pct*total/100.0)+0.5)
			return '{v:d}'.format(v=val)

		artista.pie(fracs, colors=cores, explode=explode, labels=labels, autopct=my_autopct, shadow=True)
		artista.title(cabecalho[0].decode('utf-8'), bbox={'facecolor':'0.8', 'pad':5})

		artista.show() # mostrar o grafico
		pass
		

	def grafico_barras(self, cabecalho, dados):
		'''
			Metodo para a criação de graficos de barras

			Args:	
				cabecalho: cabeçalho dos dados
				dados: dados a serem mostrados no gráfico
		'''
		
		fig = artista.figure()
		
		#arrays necessários para os gráficos de barras
		larguraBarra = 0.8
		label = [] 
		cores = [] 
		array_valores = []
		array_anos = []
		
		for a in xrange(2, 18):
			
			array_anos.append(cabecalho[a])
			pass

		for b in xrange(0, 16):
			array_valores.append(dados[b])
			cores.append([random.random(), random.random(), random.random()])
		
		N = len(array_anos)
		ind = np.arange(N)
		
		#criar barras
		rects = artista.bar(ind, array_valores, width = larguraBarra,
		bottom = 0, color=cores, align = 'center')
		
		#espaçamento entre as barras
		artista.xticks(ind, array_anos)
		fig.autofmt_xdate(rotation=90)
		
		#labels dos eixos
		artista.xlabel('Anos') 
		artista.ylabel('Quantidade de {0}'.format(cabecalho[1]))
		
		#artista.grid(True)
		
		#mete os valores por cima das barras
		self.autolabel(rects, array_valores)

		artista.title(cabecalho[0].decode('utf-8'))
		artista.show() # mostrar o grafico
		
		pass
        
	def autolabel(self, rects, valuesArray):
		'''
			Metodo para adicionar os valores ao meio das barras

			Args:	
				rects: array com as barras
				valuesArray: array com os valores a introduzir
		'''
		i = 0
		for rect in rects:
			height = rect.get_height()
			#0.5-> metade do tamanho da barra
			artista.text(rect.get_x()+rect.get_width()/2., 0.5*height, '%s'%(valuesArray[i]), ha='center', va='bottom')
			i = i + 1
			pass
		pass